﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Navigation;

using ibba.src.sl.componentes;
using ig = Infragistics.Controls.Grids;

namespace ibba.src.noriskbo.views
{
    public partial class PagePendenciaEnquadramento : Page, Subject
    {

        #region VariaveiMainPage

        private MainPageHelper _mainPage;
        
        #endregion

        #region variaveis

        private PagePendenciaEnquadramentoManualPresenter _presenter;
        private List<ServiceEnquadramento.EnquadramentoOperacao> _enquadramentooperacao;
        private string _tipoVisualizacao;

        private const string STATUS_RASCUNHO = "R";
        private const string STATUS_EM_APROVACAO = "E";

        private const string NOME_BOTAO_SOLICITAR_APROVACAO = "PagePendenciaEnquadramento_Solicitar";
        private const string NOME_BOTAO_EXCLUIR_RASCUNHO = "PagePendenciaEnquadramento_Excluir";
        private const string NOME_BOTAO_APROVAR = "PagePendenciaEnquadramento_Aprovar";
        private const string NOME_BOTAO_REJEITAR = "PagePendenciaEnquadramento_Rejeitar";

        private FluxoAprovacao _fluxoAprovacao;
        private bool _gridConfigurada;
        #endregion

        public PagePendenciaEnquadramento()
        {
            InitializeComponent();

            this.Title = string.Concat(AppHelper.NomeSistema, ": Pendências Enquadramento");
            _mainPage = new MainPageHelper();

            _presenter = new PagePendenciaEnquadramentoManualPresenter();
            _fluxoAprovacao = new FluxoAprovacao(this);

            InicializarGrid();

            this.activity.BusyContent = "Carregando...";
            spOperacoes.Visibility = Visibility.Visible;
        }

        private void InicializarGrid()
        {
            XamGridHelper.ConfiguracaoPadrao(xgOperacoes);
            XamGridHelper.ConfiguraPaginacao(xgOperacoes);

            xgOperacoes.Columns.ColumnLayout.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(OnColumnPropertyChanged);
            xgOperacoesTools.SourceBehavior = xgOperacoesBehavior;
        }

        void OnColumnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "ColumnLayoutFilteringInvalidated")
            {
                AlterarVisibilidadeBotoesConformeSelecao();

                //foreach (var item in xgOperacoes.FilteringSettings.RowFiltersCollection)
                //{
                //    if (item.Conditions.Count > 0)
                //        xgOperacoes.Columns[item.FieldName].HeaderStyle = App.Current.Resources["BlueHeaderStyle"] as Style;
                //    else
                //        xgOperacoes.Columns[item.FieldName].HeaderStyle = null;
                //}
            }
        }

        // Executes when the user navigates to this page.
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            MontarBotoes();

            _mainPage.BarraPesquisa.CampoPesquisaVisivel = System.Windows.Visibility.Collapsed;

            if (this.NavigationContext.QueryString.ContainsKey("visualizacao"))
                _tipoVisualizacao = this.NavigationContext.QueryString["visualizacao"];

            this.chkFiltroNaoEnquadrado.IsChecked = true;
            this.chkFiltroEnquadrado.IsChecked = true;
            chkSelecionarTodos.IsChecked = false;

            AlterarVisibilidadeResultadoOperacoes(Visibility.Collapsed);

            lblNenhumRegistroEncontrado.Visibility = Visibility.Collapsed;
            chkSelecionarTodos.Visibility = Visibility.Collapsed;

            if (_tipoVisualizacao == STATUS_RASCUNHO)
            {

                lblOperacoes.Text = "Enquadramento manual em rascunho";
                chkFiltroMeus.Content = "Meus rascunhos";
                chkFiltroOutros.Content = "Outros rascunhos";

            }
            else
            {
                lblOperacoes.Text = "Enquadramento manual pendente de aprovação";
                chkFiltroMeus.Content = "Minhas solicitações";
                chkFiltroOutros.Content = "Outras solicitações";

            }

            ConfigurarFiltros();

            ObterEnquadramentosPendentes();



            DesativarTodosBotoes();

        }

        private void AlterarVisibilidadeResultadoOperacoes(Visibility pVisibility)
        {
            xgOperacoes.Visibility = pVisibility;
            chkSelecionarTodos.Visibility = pVisibility;

            lblNenhumRegistroEncontrado.Visibility = pVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
        }

        private void DesativarTodosBotoes()
        {
            _mainPage.BarraMenu.AlterarVisibilidadeBotao(NOME_BOTAO_SOLICITAR_APROVACAO, false);
            _mainPage.BarraMenu.AlterarVisibilidadeBotao(NOME_BOTAO_EXCLUIR_RASCUNHO, false);
            _mainPage.BarraMenu.AlterarVisibilidadeBotao(NOME_BOTAO_APROVAR, false);
            _mainPage.BarraMenu.AlterarVisibilidadeBotao(NOME_BOTAO_REJEITAR, false);
        }

        private void ObterEnquadramentosPendentes()
        {

            activity.IsBusy = true;

            _presenter.ObterEnquadramentosPendentes(_tipoVisualizacao,
                (pAsyncResult) =>
                {
                    this.Dispatcher.BeginInvoke(delegate()
                    {
                        _enquadramentooperacao = ((ServiceEnquadramento.IEnquadramentoOperacao)pAsyncResult.AsyncState).EndObterEnquadramentosPendentes(pAsyncResult);

                        if (_enquadramentooperacao.Count > 0)
                        {
                            AlterarVisibilidadeResultadoOperacoes(Visibility.Visible);

                        }
                        else
                        {
                            AlterarVisibilidadeResultadoOperacoes(Visibility.Collapsed);

                        }

                        AplicarFiltro();

                        activity.IsBusy = false;

                    });
                });
        }

        private void AplicarFiltro()
        {

            List<ServiceEnquadramento.EnquadramentoOperacao> operacoes;

            bool NaoEnquadradas = false;
            bool Enquadradas = false;

            NaoEnquadradas = chkFiltroNaoEnquadrado.IsChecked == true;

            Enquadradas = chkFiltroEnquadrado.IsChecked == true;

            operacoes = (from s in _enquadramentooperacao
                         where ((Enquadradas && s.IdSubLimite != 0) || (NaoEnquadradas && s.IdSubLimite == 0))
                         select s).ToList();

            //  if (_tipoVisualizacao == STATUS_RASCUNHO)
            //  {
            if ((chkFiltroMeus.IsChecked == true) && (chkFiltroOutros.IsChecked == false))
            {
                operacoes = (from s in operacoes
                             where (s.CodigoUsuario.ToUpper() == AppHelper.LoginUsuario.ToUpper()) && ((Enquadradas && s.IdSubLimite != 0) || (NaoEnquadradas && s.IdSubLimite == 0))
                             select s).ToList();
            }
            if ((chkFiltroOutros.IsChecked == true) && (chkFiltroMeus.IsChecked == false))
            {
                operacoes = (from s in operacoes
                             where (s.CodigoUsuario.ToUpper() != AppHelper.LoginUsuario.ToUpper()) && ((Enquadradas && s.IdSubLimite != 0) || (NaoEnquadradas && s.IdSubLimite == 0))
                             select s).ToList();
            }
            if ((chkFiltroOutros.IsChecked == false) && (chkFiltroMeus.IsChecked == false))
            {
                operacoes = (from s in operacoes
                             where (s.CodigoUsuario.ToUpper() == null) && ((Enquadradas && s.IdSubLimite != 0) || (NaoEnquadradas && s.IdSubLimite == 0))
                             select s).ToList();
            }
            // }


            CarregarOperacoes(operacoes);
            AlterarVisibilidadeBotoesConformeSelecao();

        }

        private void CarregarOperacoes(List<ServiceEnquadramento.EnquadramentoOperacao> operacoes)
        {
            if (operacoes.Count > 0)
            {
                //grdOperacoes.SelectedIndex = 0;
                xgOperacoes.Visibility = Visibility.Visible;
            }

            PopularGrid(operacoes);
        }

        private void PopularGrid(List<ServiceEnquadramento.EnquadramentoOperacao> operacoes)
        {
            //PagedCollectionView taskListView = new PagedCollectionView(operacoes);

            //if (taskListView.CanGroup == true)
            //{
            //    taskListView.GroupDescriptions.Add(new PropertyGroupDescription("Data", new sl.recursos.Converters.DateTimeConverter()));
            //    taskListView.GroupDescriptions.Add(new PropertyGroupDescription("NomeGrupo"));
            //}
            //xgOperacoes.ItemsSource = taskListView;

            xgOperacoes.ItemsSource = operacoes;
            xgOperacoesTools.ShowRecordCount(operacoes.Count);

            if (_gridConfigurada == false)
            {
                _gridConfigurada = true;
                xgOperacoes.GroupBySettings.GroupByColumns.Add((ig.Column)xgOperacoes.Columns["DataSolicitacao"]);
                xgOperacoes.GroupBySettings.GroupByColumns.Add((ig.Column)xgOperacoes.Columns["NomeGrupo"]);

                xgOperacoes.GroupBySettings.IsGroupByAreaExpanded = true;

                xgOperacoesBehavior.SaveColumnConfiguration();
            }
        }

        private void ConfigurarFiltros()
        {
            this.chkFiltroNaoEnquadrado.IsChecked = true;
            this.chkFiltroNaoEnquadrado.IsChecked = true;

            this.chkFiltroMeus.IsChecked = true;
            this.chkFiltroOutros.IsChecked = true;

        }

        private void HabilitarBotoes()
        {

            List<ServiceEnquadramento.EnquadramentoOperacao> operacoes = ObterOperacoesSelecionadas();
            bool ativaBotao = false;


            if (_tipoVisualizacao == STATUS_RASCUNHO)
            {
                ativaBotao = EnquadramentoHelper.TodasOperacoesEmRascunhoOuAutomatica(ObterOperacoesSelecionadas(), STATUS_RASCUNHO);

                _mainPage.BarraMenu.AlterarVisibilidadeBotao(NOME_BOTAO_SOLICITAR_APROVACAO, ativaBotao);
                _mainPage.BarraMenu.AlterarVisibilidadeBotao(NOME_BOTAO_EXCLUIR_RASCUNHO, ativaBotao);
            }
            else if (_tipoVisualizacao == STATUS_EM_APROVACAO)
            {
                ativaBotao = EnquadramentoHelper.TodasOperacoesAguardandoAprovacao(ObterOperacoesSelecionadas(), STATUS_EM_APROVACAO);

                _mainPage.BarraMenu.AlterarVisibilidadeBotao(NOME_BOTAO_APROVAR, ativaBotao);
                _mainPage.BarraMenu.AlterarVisibilidadeBotao(NOME_BOTAO_REJEITAR, ativaBotao);

            }
        }

        private void MontarBotoes()
        {
            _mainPage.BarraMenu.ClearButtons();

            _mainPage.BarraMenu.AddNewButton(NOME_BOTAO_SOLICITAR_APROVACAO, "Solicitar aprovação", Constantes.SourceImagem.BOTAO_SOLICITAR_APROVACAO, 0,
                                    new ControlMenuBar.Botao.DelegateClick(BotaoSolicitarAprovacao_Click));

            _mainPage.BarraMenu.AddNewButton(NOME_BOTAO_EXCLUIR_RASCUNHO, "Excluir rascunho", Constantes.SourceImagem.BOTAO_EXCLUIR, 0,
                                    new ControlMenuBar.Botao.DelegateClick(BotaoExcluirRascunho_Click));

            _mainPage.BarraMenu.AddNewButton(NOME_BOTAO_APROVAR, "Aprovar", Constantes.SourceImagem.BOTAO_APROVAR, 0,
                                    new ControlMenuBar.Botao.DelegateClick(BotaoAprovar_Click));

            _mainPage.BarraMenu.AddNewButton(NOME_BOTAO_REJEITAR, "Rejeitar", Constantes.SourceImagem.BOTAO_REJEITAR, 0,
                                    new ControlMenuBar.Botao.DelegateClick(BotaoRejeitar_Click));

            _mainPage.BarraMenu.AddNewButton("PagePendenciaEnquadramento_Voltar", "Voltar", Constantes.SourceImagem.BOTAO_VOLTAR, 0,
                                    new ControlMenuBar.Botao.DelegateClick(() =>
                                    {
                                        _mainPage.NavigateTo("/PageEnquadramento");
                                    }));


        }

        private List<ServiceEnquadramento.EnquadramentoOperacao> ObterOperacoesSelecionadas()
        {
            if (xgOperacoes.ItemsSource != null)
            {
                var rows = xgOperacoes.GetDataRows<ServiceEnquadramento.EnquadramentoOperacao>();

                return ((List<ServiceEnquadramento.EnquadramentoOperacao>)rows).Where(a => a.Selecionado == true).ToList();
            }
            else
            {
                return null;
            }
        }

        private void UsuarioDesistiu()
        {
            activity.IsBusy = false;
        }

        private void BotaoSolicitarAprovacao_Click()
        {
            activity.IsBusy = true;
            _fluxoAprovacao.SolicitarAprovacao(ObterIdOperacoesSelecionadas(),
                                                CallBackAcaoBotao(),
                                                UsuarioDesistiu,
                                                this.Dispatcher);

        }

        private void BotaoExcluirRascunho_Click()
        {
            activity.IsBusy = true;
            _fluxoAprovacao.ExcluirRascunho(ObterIdOperacoesSelecionadas(),
                                          (r) =>
                                          {
                                              ObterEnquadramentosPendentes();
                                              DesativarTodosBotoes();
                                          },
                                          UsuarioDesistiu,
                                          this.Dispatcher);

        }

        private void BotaoAprovar_Click()
        {
            activity.IsBusy = true;
            _fluxoAprovacao.Aprovar(ObterIdOperacoesSelecionadas(),
                                        CallBackAcaoBotao(),
                                        UsuarioDesistiu,
                                         this.Dispatcher);

        }

        private void BotaoRejeitar_Click()
        {
            activity.IsBusy = true;
            _fluxoAprovacao.Rejeitar(ObterIdOperacoesSelecionadas(),
                                         CallBackAcaoBotao(),
                                         UsuarioDesistiu,
                                         this.Dispatcher);


        }

        private FluxoAprovacao.PosExecucaoAcao CallBackAcaoBotao()
        {
            return (r) =>
            {
                activity.IsBusy = false;
                ObterEnquadramentosPendentes();
                DesativarTodosBotoes();
            };
        }


        private List<string> ObterContratoOperacoesSelecionadas()
        {
            return ((from s in ObterOperacoesSelecionadas()
                     select s.CodigoContrato).Distinct().ToList());

        }

        private List<int> ObterIdOperacoesSelecionadas()
        {
            return ((from s in ObterOperacoesSelecionadas()
                     select s.IdSubLimiteOperacao).ToList());

        }

        private void FiltroGridOperacao_Click(object sender, RoutedEventArgs e)
        {
            AplicarFiltro();
        }


        private void chkOperacao_Click(object sender, RoutedEventArgs e)
        {

            chkSelecionarTodos.IsChecked = false;
            AlterarVisibilidadeBotoesConformeSelecao();
        }

        private void AlterarVisibilidadeBotoesConformeSelecao()
        {
            int count = ObterOperacoesSelecionadas().Count;
            lblOperacoesSelecionadas.Content = count;

            DesativarTodosBotoes();

            if (count > 0)
                HabilitarBotoes();

        }

        private void chkSelecionarTodos_Click(object sender, RoutedEventArgs e)
        {
            //Obtem as linhas da grid
            var itemSource = xgOperacoes.GetDataRows<ServiceEnquadramento.EnquadramentoOperacao>();

            ((List<ServiceEnquadramento.EnquadramentoOperacao>)itemSource).ForEach(s => s.Selecionado = chkSelecionarTodos.IsChecked.Value);

            //((List<ServiceEnquadramento.EnquadramentoOperacao>)((System.Windows.Data.PagedCollectionView)xgOperacoes.ItemsSource).SourceCollection).ForEach(a => a.Selecionado = chkSelecionarTodos.IsChecked.Value);

            AlterarVisibilidadeBotoesConformeSelecao();
        }

        private void chkOperacao_Checked(object sender, RoutedEventArgs e)
        {
            chkSelecionarTodos.IsChecked = false;

            if (((System.Windows.Controls.CheckBox)e.OriginalSource).IsChecked == true &&
                ((System.Windows.Controls.CheckBox)e.OriginalSource).Visibility == Visibility.Collapsed)
            {
                ((System.Windows.Controls.CheckBox)e.OriginalSource).IsChecked = false;
                //((ServiceEnquadramento.EnquadramentoOperacao)xgOperacoes.SelectedDataRow).Selecionado = false;
            }
        }


        #region Subject Members

        public void Update(List<ServiceEnquadramentoDuplex.EnquadramentoOperacao> pValor)
        {

            this.Dispatcher.BeginInvoke(() =>
            {

                List<ServiceEnquadramento.EnquadramentoOperacao> alteracao_operacoes;
                List<ServiceEnquadramento.EnquadramentoOperacao> novas_operacoes = new List<ServiceEnquadramento.EnquadramentoOperacao>();

                foreach (ServiceEnquadramentoDuplex.EnquadramentoOperacao valor in pValor)
                {

                    //alteracao_operacoes = (((List<ServiceEnquadramento.EnquadramentoOperacao>)((System.Windows.Data.PagedCollectionView)xgOperacoes.ItemsSource).SourceCollection))
                    //            .Where(b => b.CodigoContrato == valor.CodigoContrato).ToList();

                    alteracao_operacoes = ((List<ServiceEnquadramento.EnquadramentoOperacao>)xgOperacoes.ItemsSource).Where(b => b.CodigoContrato == valor.CodigoContrato).ToList();

                    foreach (ServiceEnquadramento.EnquadramentoOperacao o in alteracao_operacoes)
                    {
                        if (o.DataRegistro < valor.DataRegistro)
                        {
                            o.CodigoContrato = valor.CodigoContrato;
                            o.Comandado = valor.Comandado;
                            o.IdSubLimiteReenquadrado = valor.IdSubLimiteReenquadrado;
                            o.SubLimiteReenquadrado = valor.SubLimiteReenquadrado;
                            o.IdSubLimiteOperacao = valor.IdSubLimiteOperacao;
                            o.CodigoUsuario = valor.CodigoUsuario;
                            o.NomeUsuario = valor.NomeUsuario;
                            o.CodigoStatus = valor.CodigoStatus;
                            o.DescricaoStatus = valor.DescricaoStatus;
                            o.NomeGrupo = valor.NomeGrupo;
                            o.Data = valor.Data;
                            o.DataRegistro = valor.DataRegistro;
                            o.Justificativa = valor.Justificativa;
                        }
                    }

                    if (alteracao_operacoes.Count == 0)
                    {
                        novas_operacoes.Add(new ServiceEnquadramento.EnquadramentoOperacao()
                        {
                            CodigoContrato = valor.CodigoContrato,
                            CodigoProduto = valor.CodigoProduto,
                            CodigoModalidade = valor.CodigoModalidade,
                            CodigoStatus = valor.CodigoStatus,
                            CodigoUsuario = valor.CodigoUsuario,
                            Comandado = valor.Comandado,
                            Data = valor.Data,
                            DescricaoStatus = valor.DescricaoStatus,
                            IdSubLimite = valor.IdSubLimite,
                            IdSubLimiteOperacao = valor.IdSubLimiteOperacao,
                            IdSubLimiteReenquadrado = valor.IdSubLimiteReenquadrado,
                            Justificativa = valor.Justificativa,
                            NomeGrupo = valor.NomeGrupo,
                            NomeUsuario = valor.NomeUsuario,
                            Selecionado = valor.Selecionado,
                            SubLimite = valor.SubLimite,
                            SubLimiteReenquadrado = valor.SubLimiteReenquadrado,
                            DataRegistro = valor.DataRegistro
                        });
                    }
                }

                //List<ServiceEnquadramento.EnquadramentoOperacao> novas =
                //            (List<ServiceEnquadramento.EnquadramentoOperacao>)((System.Windows.Data.PagedCollectionView)xgOperacoes.ItemsSource).SourceCollection;
                List<ServiceEnquadramento.EnquadramentoOperacao> novas =
                            (List<ServiceEnquadramento.EnquadramentoOperacao>)xgOperacoes.ItemsSource;

                novas.AddRange(novas_operacoes);

                //PopularGrid(((List<ServiceEnquadramento.EnquadramentoOperacao>)((System.Windows.Data.PagedCollectionView)xgOperacoes.ItemsSource).SourceCollection).Where(a => a.CodigoStatus == _tipoVisualizacao).ToList());
                PopularGrid(((List<ServiceEnquadramento.EnquadramentoOperacao>)xgOperacoes.ItemsSource).Where(a => a.CodigoStatus == _tipoVisualizacao).ToList());
                AlterarVisibilidadeBotoesConformeSelecao();
            });
        }

        #endregion

        private void xgOperacoes_GroupByCollectionChanged(object sender, Infragistics.Controls.Grids.GroupByCollectionChangedEventArgs e)
        {
            xgOperacoes.GroupBySettings.IsGroupByAreaExpanded = (xgOperacoes.GroupBySettings.GroupByColumns.Count > 0);
            XamGridHelper.GroupByCollecionChanged(typeof(ServiceEnquadramento.EnquadramentoOperacao), true, e);
        }

        private void xgOperacoes_CellDoubleClicked(object sender, ig.CellClickedEventArgs e)
        {
            if (e.Cell.Row.RowType == ig.RowType.DataRow)
            {
                if (xgOperacoes.Columns["Selecionado"].Visibility == Visibility.Visible)
                {
                    var row = (ServiceEnquadramento.EnquadramentoOperacao)e.Cell.Row.Data;
                    row.Selecionado = !row.Selecionado;

                    RegistroSelecionado(row.Selecionado);
                }
            }
        }



        #region OS627739 -

        //OS627739 - Waldir P Fabro Jr - Inicio

        private void RegistroSelecionado(bool pIsChecked)
        {
            chkSelecionarTodos.IsChecked = false;
            AlterarVisibilidadeBotoesConformeSelecao();
        }

        //OS627739 - Fim

        #endregion


    }



}
